iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Software Development

超簡單的 Verilog 入門講解系列 第 15

[Day 15] Verilog E-1 難度丁 P2海域的探路2 - 位元移位 << , >>

  • 分享至 

  • xImage
  •  

我們在探個路一下 講講接下來可能會用到的東西

我用個 PPT 畫個圖

assign out1 = A << 1 ;

https://ithelp.ithome.com.tw/upload/images/20220928/20135862Wea71OLokE.png


assign out1 = A >> 1 ;

https://ithelp.ithome.com.tw/upload/images/20220928/20135862eWfHcaY57D.png


我們來寫一個
隨著時間軸往左推 0001 → 0010 → 0100 → 1000
然後再推回來 1000 → 0100 → 0010 → 0001


第 1 步

來最初老樣子 有reg 初始化 always + case


module Clk_Add2(reset1,clk,Out1);
input reset1 ,clk;
output[7:0] Out1;
reg[7:0] Out1;


always@(negedge reset1 or posedge clk)
begin

if( ~reset1) begin

    Out1<=1;
    
end 
else begin
    
    case () 
    1:
       
        
    0:
       
    default:
        Out1<=0;
    endcase


end


end

endmodule 



第 2 步

接下來寫一個 Reg (Data) 來檢查 Out1有沒有到 1000 或是 0001
寫一個 reg Data;
馬上初始化 Data;




module Clk_Add2(reset1,clk,Out1);
input reset1 ,clk;
output[7:0] Out1;
reg[7:0] Out1;

// 寫一個 reg Data;
reg Date;

always@(negedge reset1 or posedge clk)
begin

if( ~reset1) begin
    Out1<=1;
    
    // 馬上初始化 Data; 
    Date <= 0;
end 
else begin
    
    case (Date) 
    1:
        // 檢查 Out1有沒有到  1000  或是 0001
        if(Out1==1) begin
          
         end
         else begin
            
         end
        
    0:
            // 檢查 Out1有沒有到  1000  或是 0001
            if(Out1==8) begin
               
            end
            else begin
              
            end
    default:
        Out1<=0;
    endcase


end

end

endmodule 


第 3 步
填一下 位元移位





module Clk_Add2(reset1,clk,Out1);
input reset1 ,clk;
output[7:0] Out1;
reg[7:0] Out1;

reg Date;

always@(negedge reset1 or posedge clk)
begin

if( ~reset1) begin
    Out1<=1;
    Date <= 0;
end 
else begin
    
    case (Date) 
    1:
        if(Out1==1) begin
        //填一下 位元移位
           Date <= 0;
           Out1 <= Out1<<1;
         end
         else begin
         //填一下 位元移位
            Out1 <= Out1>>1;
         end
        
    0:
        if(Out1==8) begin
        //填一下 位元移位
             Date <= 1;
            Out1 <= Out1>>1;
        end
        else begin
        //填一下 位元移位
            Out1 <= Out1<<1;
         end
    default:
        Out1<=0;
    endcase


end


end

endmodule 



第 4 步
tb 我就不解釋了


module tb1();

reg reset1 ,clk;
wire[7:0] Out1;

Clk_Add2 Test1(.reset1(reset1),.clk(clk),.Out1(Out1));


initial begin
        clk<=0;reset1<=0;
    #7 reset1<=1;
    #6000 $stop;

end


always #5 clk<=~clk;

endmodule


第 5 步

看看結果吧

https://ithelp.ithome.com.tw/upload/images/20220928/20135862fNLGWRFtMz.png

明天我們再來畫這張圖長怎樣


上一篇
[Day 14] Verilog E-1 難度丁 P2海域的探路 - always、reset、 case
下一篇
[Day 16] Verilog E-1 難度丁 P2海域的解謎1 - 序向邏輯電路設計 (概念想法)
系列文
超簡單的 Verilog 入門講解30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言